package redis

import (
	"fmt"
	"github.com/go-redis/redis"
	"time"
)

// Redis是单线程的，因此单个命令始终是原子的，但是来自不同客户端的两个给定命令可以依次执行，例如在它们之间交替执行。
// 但是，Multi/exec能够确保在multi/exec两个语句之间的命令之间没有其他客户端正在执行命令。

// 在这种场景我们需要使用TxPipeline。
// TxPipeline总体上类似于上面的Pipeline，但是它内部会使用MULTI/EXEC包裹排队的命令。

// 相当于在一个RTT下执行了下面的redis命令：
//MULTI
//INCR pipeline_counter
//EXPIRE pipeline_counts 3600
//EXEC
func TxExample1() {
	pipe := rdb.TxPipeline()

	incr := pipe.Incr("tx_pipeline_counter")
	pipe.Expire("tx_pipeline_counter", time.Hour)

	_, err := pipe.Exec()
	fmt.Println(incr.Val(), err)
}

// 还有一个与上文类似的TxPipelined方法，使用方法如下：
func TxExample2() {
	var incr *redis.IntCmd
	_, err := rdb.TxPipelined(func(pipe redis.Pipeliner) error {
		incr = pipe.Incr("tx_pipelined_counter")
		pipe.Expire("tx_pipelined_counter", time.Hour)
		return nil
	})
	fmt.Println(incr.Val(), err)
}
